package com.cskaoyan.extend.initailize;

/*
     对于一个子类对象而言，其内存中的数据，分成了两部分：
    1. 从父类中，继承下来成员变量的值
    2. 子类中，自己定义的成员变量的值

    子类对象的初始化问题（子类中成员变量(两部分)赋予初值先后顺序）
    这两部分数据，在给他们赋初值的时候，谁先赋初值谁后赋初值（谁先初始化值，谁后初始化值）？
    java语言的结论是，一定是 先 初始化子类对象中，继承的父类变量的值，后，初始化子类对象中，
    子类自己定义的成员变量值
    先父后子

    为什么一定要先父后子:
    a. 从直觉的角度，类比于现实生活，如果要继承父辈的财产，父辈得先存在，有一定的财富积累
    b. 在实际开发中，我们子类成员变量的初值，依赖于父类成员变量值


    如何实现，在子类对象中，先父后子的，成员变量值的初始化顺序呢？
    核心思路：
    1. 首先，构造方法本身的功能，就是初始化对象成员变量值的
    2. 所以，显然，对我们只需要保证，父类的构造方法，先于子类的构造方法运行
    3. 如何让父类构造方法，先于子类构造方法执行(在子类的构造方法的，第一条语句的位置，先去调用父类)


    在子类对象初始化的过程中，保证先父后子的子类对象的初始化顺序：
    1. 子类对象的隐式初始化方式（jvm来自动保证父类构造方法自动保证）
    2. 子类对象的显示初始化方式(coder，通过写代码的方式保证，父类构造方法先执行)


 */
public class Demo1Introduction {

    public static void main(String[] args) {
        Student student = new Student();

        // 访问继承父类的成员变量值
        System.out.println(student.name);

        // 访问子类自己定义的成员变量
        System.out.println(student.studentId);
    }
}

class Person {
    // 姓名
    String name;

    int fatherI;

    public void eat() {
        System.out.println("吃饭ing");
    }

    public void sleep() {
        System.out.println("睡觉ing");
    }
}

// 利用继承使Student类 复用Person的类定义代码
class Student extends Person {

    int studentId;

    public Student() {
        // 先调用父类构造方法
        studentId = fatherI + 10;
    }

    public void study() {
        System.out.println("学习ing");
    }

}
